home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr47 / wasm223.zip / TRANSFER.ASM < prev    next >
Assembly Source File  |  1993-05-04  |  16KB  |  588 lines

  1. ;************************;
  2. ; SESSION File Transfers ;
  3. ;     By Eric Tauck      ;
  4. ;************************;
  5.  
  6. MAXLINE EQU     512     ;maximum line length
  7. INPBUF  EQU     4096    ;read input buffer size
  8.  
  9. t_han   DW      0FFFFH  ;text write handle
  10. t_fil   DW      0FFFFH  ;text read file block address
  11.  
  12. t_rea   DB      'Text file to send: ',0
  13. t_wri   DB      'Text file to receive: ',0
  14.  
  15. x_upl   DB      'Xmodem file to send: ',0
  16. x_dwn   DB      'Xmodem file to receive: ',0
  17.  
  18. x_conf  DB      'File already exists, overwrite',0
  19.  
  20. t_err   DB      'Could not open file',0
  21. t_err1  DB      'Error opening or reading from file',0
  22. t_err2  DB      'Error opening or writing to file',0
  23. x_err   DB      'Unable to complete transfer',0
  24.  
  25. x_uplp  DB      'Xmodem Upload ', 249, ' ', 0
  26. x_dwnp  DB      'Xmodem Download ', 249, ' ', 0
  27.  
  28. x_crc   DB      'CRC',0
  29. x_sum   DB      'SUM',0
  30. x_bytes DB      ' ', 249, ' Bytes=',0
  31. x_error DB      ' ', 249, ' Errors=',0
  32. x_last  DB      ' ', 249, ' Last=',0
  33.  
  34. ;========================================
  35. ; Begin reading text.
  36. ;
  37. ; In: AX= name of file (or 0 if none).
  38. ;
  39. ; Out: CY= set if error.
  40.  
  41. Text_Read_Beg   PROC    NEAR
  42.         push    di
  43.         push    si
  44.         StkAll  di, 80          ;allocate space for file name
  45.  
  46.         cmp     t_fil, 0FFFFH   ;check if already reading
  47.         je      texbeg1
  48.         push    ax
  49.         call    Text_Read_End   ;finish reading first
  50.         pop     ax
  51.  
  52. ;--- input file name
  53.  
  54. texbeg1 or      ax, ax          ;check if passed
  55.         jz      texbeg2         ;jump if not
  56.         mov     bx, di
  57.         call    StrCpy          ;copy to buffer
  58.         jmps    texbeg3
  59.         
  60. texbeg2 mov     ax,OFFSET t_rea ;prompt
  61.         mov     bx, di          ;storage for file name
  62.         call    Command_Input   ;input a file name
  63.         jc      texbeg6         ;jump if cancel
  64.  
  65. ;--- open file
  66.  
  67. texbeg3 mov     si,OFFSET t_rec ;uninitialized read record
  68.         mov     ax, INPBUF      ;buffer size
  69.         mov     bx, si
  70.         call    BufAll          ;allocate buffer
  71.         jc      texbeg5
  72.  
  73.         mov     ax, di          ;address of name
  74.         mov     bx, si
  75.         mov     cl, BUFFER_READ ;access
  76.         call    BufOpn          ;try to open
  77.         jc      texbeg4
  78.  
  79.         mov     t_fil, si       ;record address
  80.         StkRel  80              ;fix stack
  81.         pop     si
  82.         pop     di
  83.         clc
  84.         ret
  85.  
  86. ;--- error
  87.  
  88. texbeg4 mov     bx, si
  89.         call    BufRel                  ;release buffer
  90.  
  91. texbeg5 mov     ax, OFFSET t_err        ;error message
  92.         call    Command_Error           ;display
  93.  
  94. ;--- finished
  95.  
  96. texbeg6 StkRel  80              ;fix stack
  97.         pop     si
  98.         pop     di
  99.         stc
  100.         ret
  101.         ENDP
  102.  
  103. ;========================================
  104. ; Finish reading text.
  105.  
  106. Text_Read_End   PROC    NEAR
  107.         cmp     t_fil, 0FFFFH   ;check if not open
  108.         je      texren1         ;jump if so
  109.         push    di
  110.         mov     di, t_fil
  111.         mov     bx, di
  112.         call    BufClo          ;close file
  113.         mov     bx, di
  114.         call    BufRel          ;release buffer
  115.         mov     t_fil, 0FFFFH   ;reset flag
  116.         pop     di
  117. texren1 ret
  118.         ENDP
  119.  
  120. ;========================================
  121. ; Read a text byte.
  122. ;
  123. ; Out: AL= byte; CY= set if stop reading.
  124.  
  125. Text_Read       PROC    NEAR
  126. texrea1 mov     bx, t_fil       ;load file block
  127.         call    GetByt          ;read a byte
  128.         jc      texrea3
  129.         cmp     al, CR          ;skip carriage returns
  130.         je      texrea1
  131.         cmp     al, LF          ;check if linefeed
  132.         jne     texrea2
  133.         mov     al, CR          ;substitute carriage return
  134. texrea2 clc
  135. texrea3 ret
  136.         ENDP
  137.  
  138. ;========================================
  139. ; Begin writing text.
  140. ;
  141. ; In: AX= name of file (or 0 if none).
  142. ;
  143. ; CY= set if error.
  144.  
  145. Text_Write_Beg   PROC    NEAR
  146.         push    di
  147.         StkAll  di, 80          ;allocate space for file name
  148.  
  149.         cmp     t_han, 0FFFFH   ;check if already writing
  150.         je      texwbg1
  151.         push    ax
  152.         call    Text_Write_End  ;finish writing first
  153.         pop     ax
  154.  
  155. ;--- input file name
  156.  
  157. texwbg1 or      ax, ax
  158.         jz      texwbg2
  159.         mov     bx, di
  160.         call    StrCpy          ;copy to buffer
  161.         jmps    texwbg3
  162.  
  163. texwbg2 mov     ax,OFFSET t_wri ;prompt
  164.         mov     bx, di          ;storage for file name
  165.         call    Command_Input   ;input a file name
  166.         jc      texwbg8         ;jump if cancel
  167.  
  168. ;--- allocate line buffer
  169.  
  170. texwbg3 mov     ax, INPBUF      ;buffer size
  171.         call    MemAll          ;allocate memory
  172.         jc      texwbg7         ;jump if error
  173.         mov     WORD t_lin+2,ax ;save segment
  174.  
  175. ;--- open (existing) file
  176.  
  177.         mov     ax, di
  178.         mov     cl, OPEN_WRITE  ;open for writing
  179.         call    FilOpn          ;open file
  180.         jc      texwbg5
  181.  
  182.         push    ax
  183.         mov     bx, ax
  184.         mov     cl, SEEK_END    ;move to end
  185.         sub     ax, ax
  186.         mov     dx, ax          ;offset zero from end
  187.         call    FilSee          ;move to end
  188.         pop     ax
  189.  
  190. texwbg4 mov     t_han, ax       ;save handle
  191.         mov     WORD t_lin, 0   ;zero offset
  192.         mov     t_cur, 0        ;zero bytes in buffer
  193.         StkRel  80              ;fix stack
  194.         pop     di
  195.         clc
  196.         ret
  197.  
  198. ;--- couldn't open file, try creating
  199.  
  200. texwbg5 cmp     al, 2           ;make sure file not found
  201.         jne     texwbg6
  202.  
  203.         mov     ax, di
  204.         mov     cl, ATTR_NORMAL ;normal attribute
  205.         call    FilCre          ;create file
  206.         jnc     texwbg4         ;loop back if okay
  207.  
  208. ;--- error or abort
  209.  
  210. texwbg6 mov     ax,WORD t_lin+2 ;line buffer
  211.         call    MemRel          ;release memory
  212.  
  213. texwbg7 mov     ax,OFFSET t_err ;error message
  214.         call    Command_Error   ;display
  215.  
  216. texwbg8 StkRel  80              ;fix stack
  217.         pop     di
  218.         stc
  219.         ret
  220.         ENDP
  221.  
  222. ;========================================
  223. ; Finish writing text.
  224.  
  225. Text_Write_End   PROC    NEAR
  226.         cmp     t_han, 0FFFFH   ;check if not open
  227.         je      texend2
  228.  
  229. ;--- write any extra in buffer
  230.  
  231.         cmp     t_cur, 0        ;check if zero bytes
  232.         je      texend1
  233.         mov     al, LF          ;end of line
  234.         call    Text_Write      ;write to force end of line
  235.  
  236. ;--- close file
  237.  
  238. texend1 mov     bx, t_han       ;handle
  239.         call    FilClo          ;close file
  240.  
  241. ;--- release line memory
  242.  
  243.         mov     ax,WORD t_lin+2 ;line buffer segment
  244.         call    MemRel          ;release memory
  245.  
  246.         mov     t_han, 0FFFFH   ;reset flag
  247. texend2 ret
  248.         ENDP
  249.  
  250. ;========================================
  251. ; Write a text byte.
  252. ;
  253. ; In: AL= byte.
  254. ;
  255. ; Out: CY= set if stop writing.
  256.  
  257. Text_Write      PROC    NEAR
  258.         cmp     al, LF  ;check if linefeed (end of line)
  259.         je      texwrt5
  260.         cmp     al, BS  ;check if backspace
  261.         je      texwrt3
  262.         cmp     al, TAB ;check if tab
  263.         je      texwrt1
  264.         cmp     al, 32  ;check if control character
  265.         jb      texwrt2
  266.  
  267. ;--- write a character
  268.  
  269. texwrt1 push    ds
  270.         lds     bx, t_lin       ;load current line buffer address
  271.         mov     [bx], al        ;store byte
  272.         pop     ds
  273.  
  274.         inc     WORD t_lin      ;increment pointer
  275.         mov     ax, t_cur       ;load byte count
  276.         inc     ax              ;increment
  277.         cmp     ax, MAXLINE     ;compare to maximum
  278.         je      texwrt6         ;jump if buffer full
  279.         mov     t_cur, ax       ;save byte count
  280. texwrt2 clc
  281.         ret
  282.  
  283. ;--- backspace
  284.  
  285. texwrt3 cmp     t_cur, 0        ;check if any characters in buffer
  286.         je      texwrt4
  287.         dec     t_cur           ;decrement byte count
  288.         dec     WORD t_lin      ;decrement pointer
  289. texwrt4 clc
  290.         ret
  291.  
  292. ;--- end of line
  293.  
  294. texwrt5 push    ds
  295.         lds     bx, t_lin       ;load current line buffer address
  296.         mov     WORD [bx],0A0DH ;write CR+LF
  297.         pop     ds
  298.         mov     ax, t_cur
  299.         inc     ax
  300.         inc     ax
  301.  
  302. ;--- write out line
  303.  
  304. texwrt6 mov     bx, t_han       ;handle
  305.         mov     cx, ax          ;bytes
  306.         mov     dx,WORD t_lin+2 ;segment
  307.         sub     ax, ax          ;offset
  308.         call    FilWri          ;write line
  309.         mov     WORD t_lin, 0   ;reset pointer
  310.         mov     t_cur, 0        ;reset byte count
  311.         ret
  312.         ENDP
  313.  
  314. ;========================================
  315. ; Xmodem user status routine.
  316.  
  317. XmdUsr  PROC    NEAR
  318.         push    si
  319.         StkAll  si, 80          ;space for prompt
  320.  
  321.         push    si
  322.  
  323.         push    ax
  324.         push    bx
  325.         push    dx
  326.         push    cx
  327.         push    ax
  328.  
  329. ;=== display status
  330.  
  331.         mov     ax, x_prom
  332.         mov     bx, si
  333.         call    StrCpy
  334.         add     si, ax
  335.  
  336. ;--- CRC
  337.  
  338.         pop     dx
  339.         mov     ax, OFFSET x_crc
  340.         test    dl, XMODEM_CRC
  341.         jnz     xmdusr1
  342.         mov     ax, OFFSET x_sum
  343.  
  344. xmdusr1 mov     bx, si
  345.         call    StrCpy
  346.         add     si, ax
  347.  
  348. ;--- byte count
  349.  
  350.         mov     ax, OFFSET x_bytes
  351.         mov     bx, si
  352.         call    StrCpy
  353.         add     si, ax
  354.  
  355.         pop     ax              ;low word of byte count
  356.         pop     dx              ;high word of byte count
  357.         mov     cx, 10          ;base
  358.         mov     bx, si          ;place to write number
  359.         call    Num2Str         ;convert to string
  360.         add     si, ax          ;update
  361.  
  362. ;--- error count
  363.  
  364.         mov     ax, OFFSET x_error
  365.         mov     bx, si
  366.         call    StrCpy
  367.         add     si, ax          ;update
  368.  
  369.         sub     dx, dx
  370.         pop     ax
  371.         push    ax
  372.         mov     cx, 10          ;base
  373.         mov     bx, si          ;place to write number
  374.         call    Num2Str         ;convert to string
  375.         add     si, ax
  376.  
  377. ;--- last error
  378.  
  379.         mov     ax, OFFSET x_last
  380.         mov     bx, si
  381.         call    StrCpy
  382.         add     si, ax          ;update
  383.  
  384.         pop     cx              ;number of errors
  385.         pop     ax
  386.  
  387.         sub     al, al
  388.         jcxz    xmdusr2
  389.         mov     al, ah
  390.         and     al, 3FH
  391. xmdusr2 sub     ah, ah
  392.         sub     dx, dx
  393.         mov     cx, 10          ;base
  394.         mov     bx, si          ;place to write number
  395.         call    Num2Str         ;convert to string
  396.  
  397. ;--- display
  398.  
  399.         pop     ax
  400.         call    Command_Status  ;display status line
  401.  
  402. ;=== check for abort
  403.  
  404.         sub     si, si          ;zero abort flag
  405.         jmps    xmdusr4         ;enter loop
  406.  
  407. xmdusr3 cmp     ax, KEY_ALT_A   ;check if abort
  408.         jne     xmdusr4         ;skip if not
  409.         inc     si              ;increment flag
  410. xmdusr4 call    KeyGet          ;get keystroke
  411.         jnc     xmdusr3         ;loop if key returned
  412.  
  413. ;--- return
  414.  
  415.         StkRel  80
  416.  
  417.         sub     si, 1           ;set carry if zero
  418.         cmc                     ;set carry if non-zero (abort)
  419.         pop     si
  420.         ret
  421.         ENDP
  422.  
  423. ;========================================
  424. ; Perform an xmodem download.
  425. ;
  426. ; In: AX= name of file or 0 if none; CL=
  427. ;     xmodem flags; BX= serial record.
  428.  
  429. Xmodem_Download PROC    NEAR
  430.         push    di
  431.         push    si
  432.         StkAll  si, 80          ;allocate space for file name
  433.  
  434.         mov     di, bx          ;save serial record
  435.  
  436.         push    ax
  437.         push    cx
  438.         call    Command_Open    ;open command line
  439.         pop     cx
  440.         pop     ax
  441.  
  442. ;--- input file name
  443.  
  444.         or      ax, ax          ;check if name passed
  445.         jz      xmoddn1         ;jump if not
  446.         push    cx
  447.         mov     bx, si
  448.         call    StrCpy          ;copy to buffer
  449.         pop     cx
  450.         jmps    xmoddn2
  451.         
  452. xmoddn1 push    cx
  453.         mov     ax,OFFSET x_dwn         ;prompt
  454.         mov     bx, si                  ;storage for file name
  455.         call    Command_Input           ;input a file name
  456.         pop     cx
  457.         jc      xmoddn6                 ;jump if cancel
  458.  
  459. ;--- check if overwrite
  460.  
  461. xmoddn2 push    cx
  462.         mov     ax, si
  463.         call    Find_File               ;check if already exists
  464.         cmc                             ;clear carry if not found
  465.         jnc      xmoddn3                ;jump if not
  466.         mov     ax, OFFSET x_conf
  467.         call    Command_Confirm         ;confirm command
  468. xmoddn3 pop     cx
  469.         jc      xmoddn1                 ;loop back to input again
  470.  
  471. ;--- perform download
  472.  
  473.         mov     x_prom, OFFSET x_dwnp   ;prompt
  474.  
  475.         mov     ax, si
  476.         mov     bx, di
  477.         call    XmdDwn                  ;perform download
  478.         jc      xmoddn4                 ;jump if error
  479.         call    Beep_Success            ;success beep
  480.         jmps    xmoddn6
  481.  
  482. xmoddn4 cmp     al, XMODEM_ABORT        ;check if download aborted
  483.         je      xmoddn6                 ;exit if so
  484.         mov     dx, OFFSET x_err        ;error message
  485.         cmp     al, XMODEM_FILE         ;check xmodem error type
  486.         jne     xmoddn5
  487.         mov     dx, OFFSET t_err2       ;file error message
  488. xmoddn5 mov     ax, dx
  489.         call    Command_Error           ;display
  490.  
  491. xmoddn6 call    Command_Close           ;close command line
  492.         StkRel  80                      ;fix stack
  493.         pop     si
  494.         pop     di
  495.         ret
  496.         ENDP
  497.  
  498. ;========================================
  499. ; Perform an xmodem upload.
  500. ;
  501. ; In: AX= name of file or 0 if none; CL=
  502. ;     xmodem flags; BX= serial record.
  503.  
  504. Xmodem_Upload PROC    NEAR
  505.         push    di
  506.         push    si
  507.         StkAll  si, 80          ;allocate space for file name
  508.  
  509.         mov     di, bx          ;save serial record
  510.  
  511.         push    ax
  512.         push    cx
  513.         call    Command_Open    ;open command line
  514.         pop     cx
  515.         pop     ax
  516.  
  517. ;--- input file name
  518.  
  519.         or      ax, ax          ;check if name passed
  520.         jz      xmodup1         ;jump if not
  521.         push    cx
  522.         mov     bx, si
  523.         call    StrCpy          ;copy to buffer
  524.         pop     cx
  525.         jmps    xmodup2
  526.         
  527. xmodup1 push    cx
  528.         mov     ax,OFFSET x_upl         ;prompt
  529.         mov     bx, si                  ;storage for file name
  530.         call    Command_Input           ;input a file name
  531.         pop     cx
  532.         jc      xmodup5                 ;jump if cancel
  533.  
  534. ;--- perform download
  535.  
  536. xmodup2 mov     x_prom, OFFSET x_uplp   ;save prompt
  537.  
  538.         mov     ax, si
  539.         mov     bx, di
  540.         call    XmdUpl                  ;perform upload
  541.         jc      xmodup3                 ;jump if error
  542.         call    Beep_Success            ;success beep
  543.         jmps    xmodup5
  544.  
  545. xmodup3 cmp     al, XMODEM_ABORT        ;check if upload aborted
  546.         je      xmodup5                 ;exit if so
  547.         mov     dx, OFFSET x_err        ;xmodem error message
  548.         cmp     al, XMODEM_FILE         ;check xmodem error type
  549.         jne     xmodup4
  550.         mov     dx, OFFSET t_err1       ;file error message
  551. xmodup4 mov     ax, dx
  552.         call    Command_Error           ;display
  553.  
  554. xmodup5 call    Command_Close           ;close command line
  555.         StkRel  80                      ;fix stack
  556.         pop     si
  557.         pop     di
  558.         ret
  559.         ENDP
  560.  
  561. ;========================================
  562. ; Determine if file exists by opening
  563. ; and closing.
  564. ;
  565. ; In: AX= name of file.
  566. ;
  567. ; Out: CY= set if not found.
  568.  
  569. Find_File PROC  NEAR
  570.  
  571. ;--- open/close file
  572.  
  573.         mov     cl, OPEN_READ   ;access mode
  574.         call    FilOpn          ;try opening
  575.         jc      finfil2         ;jump if error
  576.         mov     bx, ax
  577.         call    FilClo          ;close file
  578. finfil1 clc                     ;file found
  579.         ret
  580.  
  581. ;--- check error code
  582.  
  583. finfil2 cmp     al, 5           ;check if access denied (file exists)
  584.         je      finfil1
  585.         stc
  586.         ret
  587.         ENDP
  588.